//
//  datasTruffle.m
//  Truffle
//
//  Classe de gestion des données initiales
//  Teste si le device dispose d'un accès internet
//  Teste si l'annuaire est OK ou KO
//  Récupère les passerelles
//
//  Created by Fabrice Troilo on 05/03/10.
//  Copyright 2010 DQS . All rights reserved.
//

#import "DatasTruffle.h"
#import "GatewayConnection.h"
#import "RestConnection.h"
#import "Gateway.h"
#import "DAOTruffle.h"

@interface DatasTruffle(private)

- (void)requestPasserelles:(NSString *)searchText;

@end

@implementation DatasTruffle

@synthesize locationManager, message, accueil,latitude, longitude;

static BOOL connected = FALSE;
BOOL hasLocated=FALSE;
static NSMutableArray *passerellesObjet;
NSArray *passerelles;
static DAOTruffle *dao = nil;

/*
 * désallocation de la classe
 */
- (void)dealloc {
	[locationManager release];
	[message release];
	[accueil release];
	[restConnection release];
	[tableData release];
    [super dealloc];
}

/**
 * get the connection
 */
+(BOOL)isConnected
{
	return connected;
}

/**
 * get the passerelles
 */
+(NSMutableArray *)getGateways
{
	return passerellesObjet;
}

/*
 * get the DAO
 */
+(DAOTruffle *)getDao
{
	return dao; 
}

/*
 * Méthode de base pour faire la request Rest qui teste la connexion
 */
- (void) performRequests:(Accueil *)accueil_ {
	
	dao = [[DAOTruffle alloc] init];
	
	accueil = accueil_;
	
	NSString * URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
	connected = (URLString != NULL ) ? TRUE : FALSE;
	//[URLString release];
	
	if(connected) {
		
		/**** Debut REST ****/
		restConnection = [RestConnection new];
		/*
		 * TODO
		 * syntaxe définie avec Rachid Habel (team 2)
		 * restConnection.baseURLString = @"http://ari-31-203-01.infop6.jussieu.fr:9998/";
		 */
		/*
		 * restConnection.baseURLString = @"http://www.kidikoa.fr/";
		 * restConnection.delegate = self;
		 */
		restConnection.baseURLString = @"http://r-isr-annuaire.lip6.fr/";
		//restConnection.baseURLString = @"http://ari-31-201-04.infop6.jussieu.fr:9998/";
		restConnection.delegate = self;
		 /**** FIN REST ****/
		
		/*
		 * On dit au locationManager de travailler sur notre objet
		 */
		self.locationManager = [[[CLLocationManager alloc] init] autorelease];
		self.locationManager.delegate = self; 
	
		if (locationManager.locationServicesEnabled == NO) {
			UIAlertView *servicesDisabledAlert = [[UIAlertView alloc] initWithTitle:@"Location Services Disabled" message:@"You currently have all location services for this device disabled. If you proceed, you will be asked to confirm whether location services should be reenabled." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
			[servicesDisabledAlert show];
			[servicesDisabledAlert release];
		} else {
			//appel de la méthode didupdatewithlocation
			[locationManager startUpdatingLocation];
		}
		
	} else {
		[[(Accueil *)[self accueil] addNavigationController] dismissModalViewControllerAnimated:NO];
		[(Accueil *)[self accueil] performingRequestsError];
	}
}

- (void)locationManager: (CLLocationManager *)manager didUpdateToLocation: (CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
	[manager stopUpdatingLocation];
	
	/*
	 * géolocalisation une seule fois au lancement
	 */
	if(hasLocated==FALSE) {
		/* 
		 * TODO
		 * Syntaxe définie avec Rachid Habel (team2) :
		 * Mettre des données latitude longitude en dur pour la pré-recette
		 * latitude=double&longitude=double&prefences=chainecar&preferences=chainecar
		 */
				
		self.longitude=[NSString stringWithFormat:@"%.7f",newLocation.coordinate.longitude];
		self.latitude=[NSString stringWithFormat:@"%.7f",newLocation.coordinate.latitude];
		
		//REEL
		//message = [NSString stringWithFormat:@"?latitude=%@&longitude=%@",latitude, longitude];
		//CENSIER
		//message = [NSString stringWithFormat:@"?latitude=48.8405993&longitude=2.3554301"];
		//JUSSIEU
		message = [NSString stringWithFormat:@"?latitude=48.8500993&longitude=2.3524301"];
		
		NSLog(@">> [DatasTruffle -- locationManager] latitude : %@ longitude : %@",latitude,longitude);
		DAOTruffle * dao = [[DAOTruffle alloc] init];
		NSMutableArray *favBd = [dao getGateways];
		for(int cpt=0;cpt<[favBd count];cpt++) {
			NSLog(@">> [DatasTruffle -- locationManager] Passerelle de préférence : %@",[[favBd objectAtIndex:cpt] name]);
			if(![[[favBd objectAtIndex:cpt] name] isEqualToString:@""])
			message = [NSString stringWithFormat:@"%@&preferences=%@",message, [[favBd objectAtIndex:cpt] name]];
		}
		
		[self requestPasserelles:message];
		hasLocated=TRUE;
	}
	
}

- (void)locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error
{
	printf("\nerror");
}

#pragma mark Private Methods
- (void)requestPasserelles:(NSString *)searchText
{
	NSString *text = [searchText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
	/*
	 * TODO
	 * interface définie avec Rachid Habel (team2)
	 * NSString *urlString = [NSString stringWithFormat:@"directory%@", text];
	 */
	NSString *urlString = [NSString stringWithFormat:@"directory%@", text];
	//NSString *urlString = [NSString stringWithFormat:@"isr.php%@", text];
	[restConnection performRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];
}

#pragma mark RestConnectionDelegate

- (void)willSendRequest:(NSURLRequest *)request
{
	NSLog(@"willSendRequest: IN/OUT");
}

- (void)didReceiveResponse:(NSURLResponse *)response
{
	NSLog(@"didReceiveResponse: %@", response);
}

/* Récupération du JSON
 * la référence avec reference:adresse, position:NOM
 * les préférences (une par préférence) avec preferences:adresse, position:NOM
 */
- (void)finishedReceivingData:(NSData *)data callback:(NSString*)restconn {
	NSLog(@"finishedReceivingData: %@", [restConnection stringData]);
	
	/*
	// Get the dictionary containing the raw parsed data.
	NSDictionary *rawData = [restConnection dictionaryData];
	passerelles = [[[rawData objectForKey:@"responseData"] objectForKey:@"results"] retain];
	// Get the interesting search results data for display to the user.
	[tableData release];
	tableData = [[[rawData objectForKey:@"responseData"] objectForKey:@"results"] retain];
	//FINI
	
	// On essaie de se connecter à la passerelle.
	[self connectToGateway];
	
	[[(Accueil *)[self accueil] addNavigationController] dismissModalViewControllerAnimated:NO];
	[(Accueil *)[self accueil] donePerformingRequests];
	 */
	
	// Get the dictionary containing the raw parsed data.
	NSDictionary *rawData = [restConnection dictionaryData];
	passerellesObjet = [[NSMutableArray alloc] init];
	passerelles = [[[rawData objectForKey:@"responseData"] objectForKey:@"results"] retain];
	Gateway *gateway;
	if(![[[passerelles objectAtIndex:0] objectForKey:@"reference"] isEqualToString:@"null"]) {
		gateway = [[Gateway alloc] initGateway:[[passerelles objectAtIndex:0] objectForKey:@"reference"] :[[passerelles objectAtIndex:0] objectForKey:@"position"]];
		[passerellesObjet addObject:gateway];
	} else { // MODIF DE JONATHAN - GERE LA Récéption d'une passerelle de référence nulle
		gateway = [[Gateway alloc] initGateway:@"null" :@"null"];
		[passerellesObjet addObject:gateway];
	}	
	
	int i=1;
	for(i;i<[passerelles count];i++) {
		gateway = [[Gateway alloc] initGateway:[[passerelles objectAtIndex:i] objectForKey:@"preferences"] :[[passerelles objectAtIndex:i] objectForKey:@"position"]];
		
		if (![[[passerelles objectAtIndex:i] objectForKey:@"position"] isEqualToString:[[passerelles objectAtIndex:0] objectForKey:@"position"]])
			  [passerellesObjet addObject:gateway];
	}
	
	if([passerellesObjet count]>0 && [passerelles count]>0 && !([[[passerellesObjet objectAtIndex:0] name] isEqualToString:@"null"])) {
		
			[self connectToGateway];
		
	} else {
		connected=false;
		NSLog(@">> [DatasTruffle -- FinishedReceivingData] Annuaire KO");
		[[(Accueil *)[self accueil] addNavigationController] dismissModalViewControllerAnimated:NO];
		[(Accueil *)[self accueil] performingRequestsError];
	}	

}

- (void) connectToGateway
{
	// Connexion à la passerelle.
	
	// On crée l'objet GatewayConnection.
	GatewayConnection *gatewayConnection = [[GatewayConnection alloc] init];
	NSLog(@"Lat %@", latitude);
	[gatewayConnection setLatitude:latitude];
	[gatewayConnection setLongitude:longitude];
	Gateway * gref = [passerellesObjet objectAtIndex:0];
	gref.ref = 1;
	
	// On enregistre la passerelle dans la page d'accueil.
	[(Accueil *)[self accueil] setGateway:gref];
	
	// FIXME : mettre la bonne adresse de la passerelle. Pour l'instant on utilise un bouchon.
	[gatewayConnection setGatewayURL:gref.ip];
	NSLog(@"[DatasTruffle -- connectToGateway] Passerelle ref : %@", gref.ip);
	//[gatewayConnection setNickname:nickname];
	
	//on stocke l'ip dans la bd
	//DAOTruffle * dao = [[DAOTruffle alloc] init];
	//[dao addGateway:gref];
	
	// On lance la connexion.
	int result = [gatewayConnection connect];
	
	// En cas de problème, on n'est pas connecté.
	[[(Accueil *)[self accueil] addNavigationController] dismissModalViewControllerAnimated:NO];
	if (result < 0) {
		//connected = false;
		[(Accueil *)[self accueil] performingRequestsError];
		NSLog(@"[DatasTruffle -- connectTogateway] : Error NO GATEWAY");
		//[gatewayConnection release];
	} else {
		
		[(Accueil *)[self accueil] donePerformingRequests];
	}
	
	[(Accueil *)[self accueil] setGatewayConnection:gatewayConnection];
	[gatewayConnection release];
	// On détruit l'objet de connexion.
		
}

- (void) performRequests
{

}

@end
